# python的权限修饰符是通过对属性或者方法添加单下划线、双下划线、收尾双下划线来实现的。

#   python             java         说明
#   单下划线(_)          protected    受保护的成员，这类成员被视为仅供内部使用，允许类本身和子类方法
#   双下划线(__)         private      私有属性
#   首尾双下划线 (__a__)               表示特殊的方法（比如__init__)


class Student:
    def __init__(self, name, age, birthday):
        # 正常的属性，一般都可以访问
        self.age = age
        # self._name 受保护的，只能类和子类方法
        self._name = name
        # 私有属性，正常情况下只能本类访问（用特殊手段，外部类也能够访问私有属性
        self.__birthday = birthday

    # 受保护的实例方法，只能本类和子类的进行访问
    def _func1(self):
        # 调用私有方法 __func2
        self.__func2()

    # 私有属性
    def __func2(self):
        print('_func2:', self._name, ' age:', self.age, ' birthday:', self.__birthday)


s1=Student('yinsc',18,'1994-01-01')
s2=Student('zhumq',16,'1994-01-02')

s1._func1()
s2._func1()

print('-' * 40)

# 用特殊手段访问私有属性，但是不推荐这种访问方式
print(s1._Student__birthday)
print(s2._Student__birthday)


# python将所有的属性就会收集起来，如下所示。
print(dir(s2))